package cn.iocoder.yudao.module.shop.staff.service;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.validation.groups.CreateGroup;
import cn.iocoder.yudao.framework.validation.groups.UpdateGroup;
import cn.iocoder.yudao.module.api.shop.staff.dto.ShopStaffSaveDTO;
import cn.iocoder.yudao.module.api.shop.staff.enums.ShopStaffRoleEnum;
import cn.iocoder.yudao.module.shop.staff.pojo.dto.ShopStaffPageDTO;
import cn.iocoder.yudao.module.shop.staff.pojo.po.ShopStaff;
import jakarta.annotation.Nullable;
import org.springframework.validation.annotation.Validated;

import java.util.List;

/**
 * 店员 Service 实现类
 *
 * @author 山野羡民
 */
public interface ShopStaffService {

    /**
     * 创建店员
     *
     * @param reqVO 创建信息
     * @return 编号
     */
    Long createStaff(@Validated(value = {CreateGroup.class}) ShopStaffSaveDTO reqVO);

    /**
     * 更新店员
     *
     * @param reqVO 更新信息
     */
    void updateStaff(@Validated(value = {UpdateGroup.class}) ShopStaffSaveDTO reqVO);

    /**
     * 保存店员
     *
     * @param dto 保存信息
     */
    void saveStaff(ShopStaffSaveDTO dto);

    /**
     * 删除店员
     *
     * @param id 编号
     */
    void deleteStaff(Long id);

    /**
     * 获得店员
     *
     * @param id 编号
     * @return 店员
     */
    ShopStaff getStaff(Long id);

    /**
     * 获得店员分页
     *
     * @param pageReqVO 分页查询
     * @return 店员分页
     */
    PageResult<ShopStaff> getStaffPage(ShopStaffPageDTO pageReqVO);

    /**
     * 根据店铺编号获取店员
     *
     * @param shopId 店铺编号
     * @param role 角色，{@link ShopStaffRoleEnum}
     * @return 店员
     */
    List<ShopStaff> getByShopId(Long shopId, @Nullable Integer role);

    /**
     * 根据前台用户编号获取店员
     *
     * @param memberUserId 前台用户编号
     * @return 店员
     */
    List<ShopStaff> getByMemberUserId(Long memberUserId);

    /**
     * 根据前台用户编号获取店员
     *
     * @param shopId 店铺编号
     * @param memberUserId 前台用户编号
     * @return 店员
     */
    ShopStaff getByMemberUserId(Long shopId, Long memberUserId);

    /**
     * 根据后台用户编号获取店员
     *
     * @param adminUserId 后台用户编号
     * @return 店员
     */
    List<ShopStaff> getByAdminUserId(Long adminUserId);

    /**
     * 根据后台用户编号获取店员
     *
     * @param shopId 店铺编号
     * @param adminUserId 后台用户编号
     * @return 店员
     */
    ShopStaff getByAdminUserId(Long shopId, Long adminUserId);

    /**
     * 根据手机号码获取店员
     *
     * @param shopId 店铺编号
     * @param mobile 手机号码
     * @return 店员
     */
    ShopStaff getByMobile(Long shopId, String mobile);

    /**
     * 根据角色获取店员
     *
     * @param userId 用户编号
     * @param userType 用户类型
     * @param role 店员角色
     * @return 店员
     */
    ShopStaff getByUserId(Long userId, Integer userType, @Nullable Integer role);

    /**
     * 判断用户是否为店员
     *
     * @param userId 用户编号
     * @param userType 用户类型
     * @param role 店员角色
     * @return 是否为店员
     */
    boolean isStaff(Long userId, Integer userType, @Nullable Integer role);

    /**
     * 更新店员状态
     *
     * @param id 编号
     * @param status 状态
     */
    void updateStaffStatus(Long id, Integer status);

}